(defglobal
	?*menuprinc* = 1
	?*busqueda* = VAIO
	?*contador* = 0
	?*menuaux* = 1
	?*index* = 0
)

(deftemplate computadora
	(slot marca
		(default ?DERIVE))
	(slot modelo
		(default ?DERIVE))
	(slot memoria
		(default ?DERIVE))
	(slot disco
		(default ?DERIVE))
	(slot estado
		(default ?DERIVE))
	(slot contador
		(default ?DERIVE))
)

(deffacts computadoras "Hechos de computadoras"
	(computadora (marca Toshiba) (modelo Satellite) (memoria 4GB) (disco 1TB) (estado stock) (contador 0))
	(computadora (marca VAIO) (modelo SVS) (memoria 3GB) (disco 400GB) (estado transito)(contador 0))
	(computadora (marca VAIO) (modelo PLB) (memoria 16GB) (disco 750GB) (estado bodega)(contador 0))
	(computadora (marca Mac) (modelo Air) (memoria 6GB) (disco 750GB) (estado stock)(contador 0))
	(computadora (marca HP) (modelo Pavillion) (memoria 2GB) (disco 500GB) (estado bodega)(contador 0))
	(computadora (marca Mac) (modelo Pro) (memoria 8GB) (disco 400GB) (estado transito)(contador 0))
	(computadora (marca Mac) (modelo Pro) (memoria 4GB) (disco 750GB) (estado stock)(contador 0))
	(computadora (marca VAIO) (modelo Pro) (memoria 8GB) (disco 400GB) (estado transito)(contador 0))
	(computadora (marca Mac) (modelo Pro) (memoria 8GB) (disco 500GB) (estado bodega)(contador 0))
	(computadora (marca Mac) (modelo Pro) (memoria 2GB) (disco 750GB) (estado transito)(contador 0))
	(computadora (marca VAIO) (modelo Pro) (memoria 8GB) (disco 400GB) (estado stock)(contador 0))
	(computadora (marca Toshiba) (modelo Toshiba) (memoria 2GB) (disco 750GB)(estado bodega) (contador 0))
	(computadora (marca Mac) (modelo HP) (estado transito)(memoria 8GB) (disco 500GB) (contador 0))
	(computadora (marca HP) (modelo Pro) (memoria 3GB) (estado stock)(disco 1TB) (contador 0))
	(computadora (marca Toshiba) (modelo Satellite) (memoria 16GB) (estado bodega)(disco 400GB) (contador 1))
	(computadora (marca VAIO) (modelo PLB) (memoria 2GB) (disco 750GB) (contador 0))
	(computadora (marca Mac) (modelo VAIO) (memoria 6GB) (disco 500GB) (estado stock)(contador 0))
	(computadora (marca Toshiba) (modelo Pro)(estado bodega) (memoria 8GB) (disco 1TB) (contador 0))
	(computadora (marca HP) (modelo Toshiba) (memoria 3GB) (estado stock)(disco 400GB) (contador 0))
	(computadora (marca VAIO) (estado transito)(modelo PLB) (memoria 6GB) (disco 1TB) (contador 0))
	(computadora (marca Toshiba) (modelo Qosmio) (estado transito)(memoria 16GB) (disco 1TB) (contador 0))
)

(defrule Menu-Inicio
	(declare (salience 7))
=>
	(printout t crlf crlf)
	(printout t "------------- BIENVENIDO - PRACTICA 1 - IA1 -------------" crlf)
	(printout t "------------ LUIS ANGEL DIONICIO - 200915133 ------------" crlf crlf)
	(printout t "## MENU PRINCIPAL ##" crlf)
	(printout t "1. Busqueda de hechos." crlf)
	(printout t "2. Modificar hechos." crlf)
	(printout t "3. Eliminacion de hechos." crlf)
	(printout t "4. Salir." crlf crlf)
	(printout t "Por favor ingrese el numero de la opcion que desee:" crlf)
	(bind ?*menuprinc*(read))
	(switch ?*menuprinc*
		(case 1 then (printout t crlf "Ingrese lo que desee buscar:" crlf)
					 (bind ?*busqueda*(readline))
					 (printout t crlf "******----------------------******" crlf)
					 (assert (menu "1"))
		)
		(case 2 then (printout t crlf "Ingrese la palabra de los hechos que desee modificar:" crlf)
					 (bind ?*busqueda*(readline))
					 (printout t crlf "******----------------------******" crlf)
					 (assert (menu "2"))
		)
		(case 3 then (printout t crlf "Por favor ingresar que tipo de eliminacion desea hacer:" crlf)
					 (printout t  "1. Eliminar los que tengan coincidencia" crlf)
					 (printout t  "2. Eliminar los que NO tengan coinciden" crlf)
					 (bind ?*menuaux*(read))
					 (switch ?*menuaux*
						(case 1 then (printout t crlf "Ingrese lo que desee buscar:" crlf)
									 (bind ?*busqueda*(readline))
									 (printout t crlf "******----------------------******" crlf)
									 (assert (menu "3"))
						)
						(case 2 then (printout t crlf "Ingrese lo que desee buscar:" crlf)
									 (bind ?*busqueda*(readline))
									 (printout t crlf "******----------------------******" crlf)
									 (assert (menu "4"))
									 
						)
						(default (printout t "Debe escoger una opcion valida!" crlf))
					 )
		)
		(case 4 then (printout t "Adios! :D" crlf)
		)
		(default (printout t "Debe escoger una opcion valida xD" crlf)
		)
	)
)

(defrule encontrar-hecho "Encontrar todos los hechos que coincidan con la palabra"
	(declare (salience 5))
	(menu "1")
	(computadora (marca ?marca) (modelo ?modelo) (memoria ?memoria) (disco ?disco) (estado ?estado)(contador ?contador))
	=>
		(if (or (= (str-compare ?marca ?*busqueda*) 0) (= (str-compare ?modelo ?*busqueda*) 0) 
				(= (str-compare ?memoria ?*busqueda*) 0) (= (str-compare ?disco ?*busqueda*) 0) 
				(= (str-compare ?estado ?*busqueda*) 0) )
		then
			(printout t "coincidencia: marca " ?marca " modelo: " ?modelo " memoria: " ?memoria " disco: " ?disco " contador: " ?contador crlf)
		)
)

(defrule modificar-hecho "Modificar los contadores de las coincidencias"
	(declare (salience 4))
	(menu "2")
	?registro <-(computadora (marca ?marca) (modelo ?modelo) (memoria ?memoria) (disco ?disco) (estado ?estado)(contador ?contador))
	=>
		(if (= ?*index* 0)
			then
				(bind ?*index* (fact-index ?registro))
				(bind ?*index* (+ ?*index* 1))
		)
		(bind ?index (fact-index ?registro))
		(if (and (or (= (str-compare ?marca ?*busqueda*) 0) (= (str-compare ?modelo ?*busqueda*) 0) 
				(= (str-compare ?memoria ?*busqueda*) 0) (= (str-compare ?disco ?*busqueda*) 0) 
				(= (str-compare ?estado ?*busqueda*) 0) ) (<  ?index ?*index*))
		then
			(bind ?nuevo (+ ?contador 1))
			(bind ?*index* (- ?*index* 1))
			(modify ?registro (contador ?nuevo))
			(printout t "modificado: marca " ?marca " modelo: " ?modelo " memoria: " ?memoria " disco: " ?disco " contador: " ?nuevo crlf)
		)
)

(defrule eliminar-hecho-si "Eliminar con coincidencias"
	(declare (salience 3))
	(menu "3")
	?registro <-(computadora (marca ?marca) (modelo ?modelo) (memoria ?memoria) (disco ?disco) (estado ?estado)(contador ?contador))
	=>
		(if (or (= (str-compare ?marca ?*busqueda*) 0) (= (str-compare ?modelo ?*busqueda*) 0) 
				(= (str-compare ?memoria ?*busqueda*) 0) (= (str-compare ?disco ?*busqueda*) 0) 
				(= (str-compare ?estado ?*busqueda*) 0) )
		then
			(retract ?registro)
			(printout t "eliminado: marca " ?marca " modelo: " ?modelo " memoria: " ?memoria " disco: " ?disco " contador: " ?contador crlf)
		)
)
(defrule eliminar-hecho-no "Eliminar sin coincidencias"
	(declare (salience 2))
	(menu "4")
	?registro <-(computadora (marca ?marca) (modelo ?modelo) (memoria ?memoria) (disco ?disco) (estado ?estado)(contador ?contador))
	=>
		(if (or (= (str-compare ?marca ?*busqueda*) 0) (= (str-compare ?modelo ?*busqueda*) 0) 
				(= (str-compare ?memoria ?*busqueda*) 0) (= (str-compare ?disco ?*busqueda*) 0) 
				(= (str-compare ?estado ?*busqueda*) 0) )
		then
		else
			(retract ?registro)
			(printout t "eliminado: marca " ?marca " modelo: " ?modelo " memoria: " ?memoria " disco: " ?disco " contador: " ?contador crlf)
		)
)
